#ifndef MEMPOOL_H
#define MEMPOOL_H

#include <stdio.h>
#include <stdlib.h>

// 内存页大小（按系统页对齐，通常为4KB）
#define PAGE_SIZE 4096

// 内存块头部结构（放在实际数据前）
typedef struct Block {
    size_t total_size;     // 块总大小（含头部,页的整数倍）
    int is_free;           // 是否空闲（1:空闲，0:已分配）
    struct Block* prev;    // 前向指针（双向链表）
    struct Block* next;    // 后向指针
} Block;

// 内存池结构
typedef struct {
    Block* free_list;      // 空闲块链表头
    Block* tail;           // 链表尾（便于扩展）
} MemoryPool;

/*
* @file mempool.h
* @brief 创建内存池
* @return 成功：内存池指针 失败：NULL
* @author zhw
* @date 2025.10.23 22:30
* @version 1.0
*/
MemoryPool* MemPoolCreate();

/*
* @file mempool.h
* 从内存池分配内存
* @param pool 内存池句柄
* @param size 要分配的字节数（用户数据大小）
* @return 分配的内存指针（失败返回NULL）
* @author zhw
* @date 2025.10.22 23:20
* @version 1.0
*/
void* MemPoolAlloc(MemoryPool* pool, size_t size);

/*
* @file mempool.h
* @brief 将内存块释放回内存池
* @param pool 内存池指针
* @param ptr 内存块数据部分指针
* @return 失败:-1 成功:0
* @author zhw
* @date 2025.10.26 22:58
* @version 1.0
*/
int MemPoolFree(MemoryPool* pool, void* ptr);

/*
* @file mempool.h
* @brief 销毁内存池
* @param pool 内存池指针
* @return -1:pool为空 0:成功
* @author zhw
* @date 2025.10.26 22:58
* @version 1.0
*/
int MemPoolDestroy(MemoryPool* pool);

#endif